﻿/**
 * 扩展JQ的表单验证
 */
$.extend($.fn.validatebox.defaults.rules, {
	equals : {// 密码和确认密码是否相等验证
		validator : function(value, param) {
			return value == $(param[0]).val();
		},
		message : '前后两次输入密码不一致!'
	},
	mobile : {// 手机号码格式验证
		validator : function(value) {
			return value.match(/^1[3|4|5|8][0-9]\d{4,8}$/);
		},
		message : '手机号码格式不正确'
	}
});

/**
 * 命名空间定义
 * <p>
 * 该函数声明为内部函数,一般情况下不允许外部JS调用
 * 
 * @param {String}
 *            ns 命名空间名称
 */
function _namespace(ns) {
	if (typeof(ns) != "string") { return; }
	ns = ns.split(".");
	var o = 0, ni;
	for (var i = 0, len = ns.length; i < len, ni = ns[i]; i++) {
		try {
			o = (o ? (o[ni] = o[ni] || {}) : (eval(ni + "=" + ni + "||{}")));
		} catch (e) {
			o = eval(ni + "={}");
		}
	}
}
_namespace('Common.Util');

/**
 * 格式化datagrid内容过长,通过title显示
 * 
 * @param {Object}
 *            value 显示的值
 * @param {Object}
 *            row 每一行的数据
 * @param {Integer}
 *            index 行索引
 * @return {String}
 */
Common.Util.formatter = function(value, row, index) {
	if (value) {
		return '<li title="' + value + '">' + value + '</li>';
	}
	return '';
};

/**
 * 提示框
 * 
 * @param {String}
 *            msg 提示的信息
 */
Common.Util.showMessager = function (msg) {
	$.messager.show({
		title : '提示',
		msg : msg.msg,
		timeout : 1000,
		showType : 'slide',
		style : {
			right : '',
			bottom : ''
		}
	});
}

/**
 * AJAX请求
 * 
 * @param {String}
 *            url 请求地址
 * @param {String|Object}
 *            data 发送的数据
 * @param {Function}
 *            successFn 提交成功并且后台执行成功后执行的回调函数,该回调函数会传入一个参数,这个参数包含返回的数据
 * @param {Function}
 *            erroFn 提交成功并且后台执行错误后执行的回调函数,该回调函数会传入一个参数,这个参数包含返回的数据
 */
Common.Util.ajax = function(url, data, successFn, erroFn) {
	$.messager.progress({
		title : '提示',
		msg : '正在处理请稍后... ... '
	});
	$.ajax({
		url : url,
		type : 'POST',
		dataType : 'json',
		data : data,
		success : function(msg) {
			$.messager.progress('close');
			Common.Util.showMessager(msg);
			if (msg.status == true) {
				if (successFn &&  (typeof(successFn) == 'function')) {
					successFn(msg);
				}
			} else {
				if (erroFn &&  (typeof(erroFn) == 'function')) {
					erroFn(msg);
				}
			}
		},
		error:function(XMLHttpRequest, textStatus, errorThrown){  
			$.messager.progress('close');
            if(textStatus=="parsererror"){
            	Common.Util.showMessager({msg:"无权限!"});
            }
        }
	});
}

/**
 * 清洁的AJAX请求
 * <pre>
 * 没有任何提示框的AJAX请求,
 * 请求并返回成功后直接执行回调函数.
 * </pre>
 * 
 * @param {String}
 *            url 请求地址
 * @param {String|Object}
 *            data 发送的数据
 * @param {Function}
 *            callBackFn 提交成功并且后台执行成功后执行的回调函数,该回调函数会传入一个参数,这个参数包含返回的数据
 */
Common.Util.pureAjax = function(url, data, callBackFn, erroFn) {
	$.ajax({
		url : url,
		type : 'POST',
		dataType : 'json',
		data : data,
		success : function(msg) {
			callBackFn(msg);
		}
	});
}

/**
 * 表单提交
 * 
 * @param {String}
 *            fromId 提交表单的id
 * @param {String}
 *            url 表单提交的地址
 * @param {Function}
 *            successFn 提交成功并且后台执行成功后执行的回调函数,该回调函数会传入一个参数,这个参数包含返回的数据
 * @param {Function}
 *            erroFn 提交成功并且后台执行错误后执行的回调函数,该回调函数会传入一个参数,这个参数包含返回的数据
 */
Common.Util.submitForm = function (fromId, url, successFn, erroFn) {
	var isValid = $('#' + fromId).form('validate');
	if (isValid){
		var data = $('#' + fromId).serialize();
		Common.Util.ajax(url, data, successFn, erroFn);
	}
};

/**
 * 将数据列表中选择的单个或多个数据所对应的树节点及其所有子节点id
 * 发送到后台并返回执行结果
 * 
 * @param {String}
 *            treeid 树的id
 * @param {String}
 *            datagrid 数据列表的id
 * @param {String}
 *            url 请求的地址
 * @param {Function}
 *            successFn 提交成功并且后台执行成功后执行的回调函数,该回调函数会传入一个参数,这个参数包含返回的数据
 * @param {Function}
 *            erroFn 提交成功并且后台执行错误后执行的回调函数,该回调函数会传入一个参数,这个参数包含返回的数据
 * @param {String}
 *            mark 后台接收参数,若不传此参赛默认为ids.接收参数要定义为一个数组
 */
Common.Util.sendTreeDataIds = function (treeid, datagrid, url, successFn, erroFn, mark) {
	
	var selections = $('#' + datagrid).datagrid('getSelections');
	if (selections.length <= 0) { // 判断是否选择数据,未选择数据跳出方法
		Common.Util.showMessager({msg:"未选择任何数据!"});
		return;
	}
	// 将选择的数据转换为标准的树结构
	selections = convert(selections);

	var ids = []; // 所有数据id的数组
	var node = {}; // 遍历出的父节点
	var tree = $('#' + treeid);
	
	// 取出最外层的树节点,即选择的所有数据中做顶层的节点
	for (var index in selections) {
		
		// 将所选择的顶层节点,以及其所有子节点的id组装为一个数组
		node = tree.tree('find', selections[index].id);
		if(node == null){
			ids.push(selections[index].id);
		}else{
			// 获得父节点及其所有子节点Id,返回id数组
			// 【getAllChildNodeId】这个方法在tree.js里面
			ids = ids.concat(getAllChildNodeId(tree, node));
		}
	}
	node = null;
	tree = null;
	
	if (mark) {
		mark = '&' + mark + '=';
	} else {
		mark = '&ids=';
	}
	
	var data = '';
	for ( var index in ids) {
		data += mark + ids[index];
	}

	$.messager.confirm('确认对话框', '您确定要继续吗？', function (r){
		// 判断用户选择情况,取消则退出当前方法
		if (!r) { return; }
		// 发送ajax请求
		Common.Util.ajax(url, data, successFn, erroFn);
	});
};

/**
 * 将数据列表中选择的单个或多个数据id发送到后台并返回执行结果
 * 
 * @param {String}
 *            datagrid 数据列表的id
 * @param {String}
 *            url 请求的地址
 * @param {Function}
 *            successFn 提交成功并且后台执行成功后执行的回调函数,该回调函数会传入一个参数,这个参数包含返回的数据
 * @param {Function}
 *            erroFn 提交成功并且后台执行错误后执行的回调函数,该回调函数会传入一个参数,这个参数包含返回的数据
 * @param {String}
 *            mark 后台接收参数,若不传此参赛默认为ids.接收参数要定义为一个数组
 */
Common.Util.sendGridDataIds = function (datagrid, url, successFn, erroFn, mark) {
	var data = "";
	var selections = $('#' + datagrid).datagrid('getSelections');
	if (selections.length > 0) { // 判断是否选择数据,选择了数据则遍历所有数据获得Id
		if (mark) {
			mark = "&" + mark + "=";
		} else {
			mark = "&ids=";
		}
		for (var index in selections) {
			data += mark + selections[index].id;
		}
	} else { // 未选择数据跳出方法
		Common.Util.showMessager({msg:"未选择任何数据!"});
		return;
	}
	$.messager.confirm('确认对话框', '您确定要继续吗？', function (r){
		// 判断用户选择情况,取消则退出当前方法
		if (!r) { return; }
		$.messager.progress({
			title : '提示',
			msg : '正在处理请稍后... ... '
		});
		// 发送ajax请求
		Common.Util.ajax(url, data, successFn, erroFn);
	});
};


/**
 * 判断字符串是否为空
 * 
 * @param {String} val
 *            判断的字符串
 * @returns {Boolean} 字符串去掉前后空格后为空反回true
 */
Common.Util.isEmpty = function (val){
	return !val || (val.replace(/(^\s*)|(\s*$)/g, "").length == 0);
}